package cn.simon.free.redis.jedis.list;

import java.util.List;

/**
 * redis - list 类型,专用接口
 *
 * @author simon
 * @date 2021/5/18 14:43
 * @copyright:
 * @modifier
 * @motto a no talent, people who have to study hard
 */
public interface JedisList {

    /**
     * 将一个或多个值插入到列表头部
     *
     * @param key
     * @param value
     */
    Long lPush(String key, String value);

    /**
     * 将一个或多个值插入到列表的尾部
     *
     * @param key
     * @param value
     */
    Long rPush(String key, String value);

    /**
     * 移出并获取列表的第一个元素
     *
     * @param key
     * @return
     */
    Object lPop(String key);

    /**
     * 移除列表的最后一个元素，返回值为移除的元素。
     *
     * @param key
     * @return
     */
    Object rPop(String key);

    /**
     * 移出并获取列表的第一个元素， 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
     *
     * @param key
     * @param timeOut 单位:秒
     * @return
     */
    Object bLPop(String key, long timeOut);

    /**
     * 移出并获取列表的最后一个元素， 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
     *
     * @param key
     * @param timeOut 单位:秒
     * @return
     */
    Object bRPop(String key, long timeOut);

    /**
     * 将一个值插入到已存在的列表头部(如果列表不存在，操作无效)
     *
     * @param key
     * @param value
     * @return
     */
    Long lPushX(String key, String value);

    /**
     * 将一个值插入到已存在的列表尾部(如果列表不存在，操作无效)
     *
     * @param key
     * @param value
     * @return
     */
    Long rPushX(String key, String value);

    /**
     * 获取列表指定范围内的元素
     * 区间以偏移量 start 和 stop 指定。
     * 其中 0 表示列表的第一个元素， 1 表示列表的第二个元素，以此类推。
     * 你也可以使用负数下标，以 -1 表示列表的最后一个元素， -2 表示列表的倒数第二个元素，以此类推。
     *
     * @param key
     * @param start
     * @param stop
     * @return
     */
    List<Object> lRange(String key, int start, int stop);

    /**
     * 移除列表元素
     * count > 0 : 从表头开始向表尾搜索，移除与 VALUE 相等的元素，数量为 COUNT 。
     * count < 0 : 从表尾开始向表头搜索，移除与 VALUE 相等的元素，数量为 COUNT 的绝对值。
     * count = 0 : 移除表中所有与 VALUE 相等的值
     *  @param key
     * @param count
     * @param value
     * @return
     */
    Long lRem(String key, int count, Object value);

    /**
     * 用于移除列表的最后一个元素，并将该元素添加到另一个列表并返回
     *
     * @param source
     * @param destination
     * @return
     */
    String rPopLPush(String source, String destination);

    /**
     * 从列表中弹出一个值，将弹出的元素插入到另外一个列表中并返回它； 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
     *
     * @param source
     * @param destination
     * @param timeOut     单位:秒
     * @return
     */
    Object bRPopLPush(String source, String destination, long timeOut);
}
